package com.java.basis.thread.n3.exercise;

import java.util.Random;

/**
 * 测试转账的线程安全问题
 *
 * @author wangning
 * @create 2022-01-19 16:02
 */
public class ExerciseTransfer {

	public static void main(String[] args) throws InterruptedException {
		Account a = new Account(1000);
		Account b = new Account(1000);
		Thread t1 = new Thread(() -> {
			for (int i = 0; i < 1000; i++) {
				a.transfer(b, randomAmount());
			}
		}, "t1");
		Thread t2 = new Thread(() -> {
			for (int i = 0; i < 1000; i++) {
				b.transfer(a, randomAmount());
			}
		}, "t2");
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println("total: " + (a.getMoney()+b.getMoney()));

	}

	//Random 为线程安全
	static Random random = new Random();

	//随机1-5
	public static int randomAmount() {
		return random.nextInt(100) + 1;
	}
}

//账户
class Account {
	private int money;

	public Account(int money) {
		this.money = money;
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}

	/**
	 * 转账
	 * @param target 目标账目
	 * @param amount 转账金额
	 */
	public void transfer(Account target, int amount) {
		synchronized (Account.class) {
			if (this.money >= amount) {
				this.setMoney(this.getMoney() - amount);
				target.setMoney(target.getMoney() + amount);
			}
		}
	}
}
